from sklearn import preprocessing
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin_min
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['figure.figsize'] = (16, 9)
plt.style.use('ggplot')
df_train = pd.read_csv('./data/train.csv')
df_aux = df_train
columnas = ['metroscubiertos', 'metrostotales', 'antiguedad', 'habitaciones', 'garages', 'banos',
'lat', 'lng', 'escuelascercanas', 'centroscomercialescercanos']
df = df_aux[columnas]
for columna in columnas:
df[columna] = df[columna].fillna(df[columna].mean())
df
# Normalizacion
x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled)
df.columns = columnas
display(df)
display(df.dtypes)
# for columna in columnas:
# df[columna] = df[columna].astype(int)
df
X = np.array(df[columnas])
y = np.array(df_aux['precio'])
Nc = range(1, 20)
kmeans = [KMeans(n_clusters=i) for i in Nc]
kmeans
score = [kmeans[i].fit(X).score(X) for i in range(len(kmeans))]
# score = [kmeans[i].fit(X).score(X) for i in range(20)]
score
plt.plot(Nc,score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()
# Vamos a usar 6
# Elijo 6 como un buen valor de K. Pero podría ser otro.
kmeans = KMeans(n_clusters=6).fit(X)
centroids = kmeans.cluster_centers_
print(centroids)
# Obtenemos las etiquetas de cada punto de nuestros datos
labels = kmeans.predict(X)
# Obtenemos los centroids
C = kmeans.cluster_centers_
colores=['red','green','blue','cyan','yellow', 'black']
asignar=[]
for row in labels:
asignar.append(colores[row])
fig = plt.figure(figsize=(20,20))
ax = Axes3D(fig)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=asignar,s=60)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], marker='*', c=colores, s=1000)
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['metroscubiertos'].values
f2 = df['metrostotales'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70)
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['metrostotales'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['escuelascercanas'].values
f2 = df['centroscomercialescercanos'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['habitaciones'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['garages'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['banos'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['banos'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
copy = pd.DataFrame()
copy['id'] = df_aux['id'].values
copy['label'] = labels;
cantidadGrupo = pd.DataFrame()
cantidadGrupo['color'] = colores
cantidadGrupo['cantidad'] = copy.groupby('label').size()
display(copy)
display(cantidadGrupo['cantidad'].sum())
display(cantidadGrupo)
copy.to_csv('./data/clustering_train.csv', index=False)
df_test = pd.read_csv('./data/test.csv')
df_aux = df_test
columnas = ['metroscubiertos', 'metrostotales', 'antiguedad', 'habitaciones', 'garages', 'banos',
'lat', 'lng', 'escuelascercanas', 'centroscomercialescercanos']
df = df_aux[columnas]
for columna in columnas:
df[columna] = df[columna].fillna(df[columna].mean())
df
# Normalizacion
x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled)
df.columns = columnas
display(df)
display(df.dtypes)
# for columna in columnas:
# df[columna] = df[columna].astype(int)
df
X = np.array(df[columnas])
Nc = range(1, 20)
kmeans = [KMeans(n_clusters=i) for i in Nc]
kmeans
score = [kmeans[i].fit(X).score(X) for i in range(len(kmeans))]
# score = [kmeans[i].fit(X).score(X) for i in range(20)]
score
plt.plot(Nc,score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()
# Vamos a usar 6
# Elijo 6 como un buen valor de K. Pero podría ser otro.
kmeans = KMeans(n_clusters=6).fit(X)
centroids = kmeans.cluster_centers_
print(centroids)
# Obtenemos las etiquetas de cada punto de nuestros datos
labels = kmeans.predict(X)
# Obtenemos los centroids
C = kmeans.cluster_centers_
colores=['red','green','blue','cyan','yellow', 'black']
asignar=[]
for row in labels:
asignar.append(colores[row])
fig = plt.figure(figsize=(20,20))
ax = Axes3D(fig)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=asignar,s=60)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], marker='*', c=colores, s=1000)
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['metroscubiertos'].values
f2 = df['metrostotales'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70)
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['metrostotales'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['escuelascercanas'].values
f2 = df['centroscomercialescercanos'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['habitaciones'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['garages'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['banos'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
# Hacemos una proyección a 2D con los diversos ejes
f1 = df['antiguedad'].values
f2 = df['banos'].values
plt.figure(figsize=(20,20))
plt.scatter(f1, f2, c=asignar, s=70, )
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
copy = pd.DataFrame()
copy['id'] = df_aux['id'].values
copy['label'] = labels;
cantidadGrupo = pd.DataFrame()
cantidadGrupo['color'] = colores
cantidadGrupo['cantidad'] = copy.groupby('label').size()
display(copy)
display(cantidadGrupo['cantidad'].sum())
display(cantidadGrupo)
copy.to_csv('./data/clustering_test.csv', index=False)